Appearance
P1014 Cantor 表 — 题解思路
问题
按 Z 字形给对角线数表的每一项编号:第 1 项是 1/1,然后是 1/2、2/1、 3/1、2/2、……。给定编号 N,输出第 N 项对应的分数。
关键观察
每一项的分子、分母都是正整数,且编号是按 反对角线(分子 + 分母 之和 固定的那条斜线)分组、组内方向交替往返的:
- 第
k条对角线(分子 + 分母 =k)恰有k-1项。 - 到第
k条对角线为止,累计项数为1 + 2 + ... + (k-1) = k*(k-1)/2。 - 对角线上第
pos项(从 1 数):k为奇数时分数从1/(k-1)走到(k-1)/1,即分子 =pos,分母 =k-pos;k为偶数时从(k-1)/1走到1/(k-1),即分子 =k-pos,分母 =pos。
例如 N=7:到第 k=4 条对角线累计 6 项,故第 7 项落在 k=5 的第 1 位, 奇数对角线 → 1/4,与样例一致。
算法
- 找到最小的
k使k*(k-1)/2 >= N; - 该对角线之前的项数为
(k-1)*(k-2)/2,于是本对角线上位置pos = N - (k-1)*(k-2)/2; - 按
k奇偶决定分子、分母,输出分子/分母。
复杂度
- 求
k用线性递增,k ≈ sqrt(2N),对N <= 10^7至多几千次迭代; 也可以用二分或直接解二次方程得到 O(log N) / O(1)。 - 时间
O(sqrt(N)),空间O(1)。
收获
学会把一个看似复杂的“蛇形 / 锯齿”枚举拆成「按对角线分组 + 组内方向交替」的 结构,再用等差数列求和 k*(k-1)/2 直接定位所在组与组内位置。